﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DAL;
using System.Data;
using System.IO;
using System.Configuration;
using System.Transactions;
using System.Data.Linq;
using System.ComponentModel;
using UtilityExtensions;

namespace BOL.Empresa
{
    public class GetEtapaList
    {
        int _count;



        public int Count(string proyectoStr,
                           bool bitVerInActivo,
                            string etapaStr,
                             int startRowIndex,
                              int maximumRows,
                              string sortExpression)
        {
            return _count;
        }


        public int Count(int proyectoStr,
                           int startRowIndex,
                            int maximumRows,
                            string sortExpression)
        {
            return _count;
        }


        private IQueryable<EtapaListInfo> ApplySelect_EtapaListInfo()
        {
            var q = from a in DbUtil.Db.Etapas
                    select new EtapaListInfo
                    {
                       idInternal=a.idInternal,
                       nombreConst=a.nombre,
                       nombreVenta=a.descripcion,
                       idProyecto=a.idProyecto,
                       fechaEntregaStr=a.fechaFin.ToShortDateString(),
                       fechaEntrega=a.fechaFin,
                       cantidadItemStr = String.Format("{0:N0}", a.UILocalizacions.Count),
                       cantidadItem=a.UILocalizacions.Count,
                       cantidadPisoStr = String.Format("{0:N0}", (a.UILocalizacions.Count>0)?a.UILocalizacions.Sum(p => p.UIBloques.Count):0),
                       cantidadPiso = (a.UILocalizacions.Count>0)?a.UILocalizacions.Sum(p => p.UIBloques.Count):0,
                       areaStr=String.Format("{0:N2}",a.area),
                       area=a.area,
                       bitActivo=a.bitActivo,
                       idEmpresa=a.Proyecto.idEmpresa.Value,
                       proyectoStr=a.Proyecto.descripcion,
                       };
            return q;
        }
        private IQueryable<EtapaListInfo> ApplySort(IQueryable<EtapaListInfo> q, string sortExpression)
        {
            switch (sortExpression)
            {
                case "proyectoStr":
                    q = q.OrderBy(b => b.proyectoStr);
                    break;
                case "proyectoStr DESC":
                    q = q.OrderByDescending(b => b.proyectoStr);
                    break;
                case "nombreVenta":
                    q = q.OrderBy(b => b.nombreVenta);
                    break;
                case "nombreVenta DESC":
                    q = q.OrderByDescending(b => b.nombreVenta);
                    break;

                case "bitActivo":
                    q = q.OrderBy(b => b.bitActivo);
                    break;
                case "bitActivo DESC":
                    q = q.OrderByDescending(b => b.bitActivo);
                    break;

                case "nombreConst":
                    q = q.OrderBy(b => b.nombreConst);
                    break;
                case "nombreConst DESC":
                    q = q.OrderByDescending(b => b.nombreConst);
                    break;


                case "area":
                    q = q.OrderBy(b => b.area);
                    break;
                case "area DESC":
                    q = q.OrderByDescending(b => b.area);
                    break;


                case "cantidadItem":
                    q = q.OrderBy(b => b.cantidadItem);
                    break;
                case "cantidadItem DESC":
                    q = q.OrderByDescending(b => b.cantidadItem);
                    break;


                default:
                    q = q.OrderByDescending(b => b.idInternal).OrderByDescending(p => p.nombreVenta);
                    break;
            }
            return q;
        }



        [DataObjectMethod(DataObjectMethodType.Select, false)]
        public IEnumerable<EtapaListInfo> Execute(string proyectoStr,
                                                           bool bitVerInActivo,
                                                           string etapaStr,
                                                           int startRowIndex,
                                                           int maximumRows,
                                                           string sortExpression)
        {

           

            if (!etapaStr.HasValue())
                etapaStr = "";

            var q = ApplySelect_EtapaListInfo();


            q = q.Where(a => (a.bitActivo == true | a.bitActivo == !bitVerInActivo)
                              & (a.nombreVenta.Contains(etapaStr) | a.nombreConst.Contains(etapaStr))
                               & (proyectoStr == "0" ? a.idProyecto != 0 : a.idProyecto == Convert.ToInt32(proyectoStr)));




            _count = q.Count();

            q = ApplySort(q, sortExpression);
            return q.Skip(startRowIndex).Take(maximumRows);
        }


        [DataObjectMethod(DataObjectMethodType.Select, false)]
        public IEnumerable<EtapaListInfo> Execute(int proyectoStr,
                                                                                                                      int startRowIndex,
                                                           int maximumRows,
                                                           string sortExpression)
        {
           

            var q = ApplySelect_EtapaListInfo();


            q = q.Where(a => a.idProyecto == proyectoStr);




            _count = q.Count();

            q = ApplySort(q, sortExpression);
            return q.Skip(startRowIndex).Take(maximumRows);
        }

    }
}
